/*

cimahis - Software para el analisis de imagenes de corte histologico

Copyright (C) Andrés De Abreu 2010 <jadabreu @ gmail . com>


Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo los términos
de la Licencia Pública General de GNU según es publicada por la Free Software Foundation,
bien de la versión 2 de dicha Licencia o bien (según su elección) de cualquier versión
posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA,
incluso sin la garantía MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN
PROPÓSITO PARTICULAR. Véase la Licencia Pública General de GNU para más detalles.

Debería haber recibido una copia de la Licencia Pública General junto con este programa.
Si no ha sido así, escriba a la Free Software Foundation, Inc.,
en 675 Mass Ave, Cambridge, MA 02139, EEUU.

    //ACERCA DE filtros.h
    *
    * Declaracion de la clase filtro y de las subclases filtroMediana, filtroBilateral
    * y filtroGauss.
    *

*/


#ifndef FILTROS_H
#define FILTROS_H

#include <opencv/cv.h>
#include "iostream"
#include "vector"

using namespace std;

//* Clase Abstracta filtros

class filtros
{
public:
    filtros();
    filtros(string nombreFiltro);
    void fijarTamanoKernel(int a, int b);   //*
    vector <int> obtenerTamanoKernel();
    void fijarParametroExtra(int n,int a);
    int obtenerParametroExtra(int n);
    vector <int> obtenerParametrosExtra();
    int obtenerNParametrosExtra();
    string obtenerNombre();

    virtual void filtrar(IplImage *img)=0; //funcion virtual que sera implementada en cada clase
										   // que herede de la clase filtros

protected:
    string nombre; //nombre del filtro
    int dimensiones[2]; //vector con las dimensiones del kernel o mascara que usa el filtro (en caso de usar)
    vector<int> parametroExtra; //vector que contendra los parametros extras que deben ser pasados a algunos filtros
    int nParametrosExtra; // numero de parametros extra que usa el filtro
    vector< vector<int> > *mascara;

};

///////////////////////////////////////Filtro de mediana//////////////////////
class filtroMediana : public filtros
{
public:
    filtroMediana();
    void filtrar(IplImage *img);
};

////////////////////////////////////Filtro Gaussiano///////////////////////////
class filtroGauss : public filtros
{
public:
    filtroGauss();
    void filtrar(IplImage *img);
};

////////////////////////////////////////Filtro bilateral///////////////////////
class filtroBilateral : public filtros
{
public:
    filtroBilateral();
    void filtrar(IplImage *img);
};

////////////////////////////////////// Filtro meanShift///////////////////////////
class filtroMeanShift : public filtros
{
public:
    filtroMeanShift();
    void filtrar(IplImage *img);
};


#endif // FILTROS_H
